#include <iostream>
using namespace std;
#include <cstring>
#define int long long
#define endl '\n'
const int N = 1e5 + 5;
int head[N];
int sum[N];             // 存储距离对应的花费, 前缀和
int dis[N];
int n;
struct Edge
{
    int to;
    int vis;
    int w;
    int nex;
}edge[N];       // 链式前向星存储
int cnt;
void add(int u, int v, int w)
{
    edge[cnt].w = w;
    edge[cnt].to = v;
    edge[cnt].vis = 0;
    edge[cnt].nex = head[u];
    head[u] = cnt;
    ++cnt;
}
void dfs(int u, int ds)//u遍历当前顶点，ds表示起点到当前顶点的距离
{
    dis[u] = ds;
    for(int i = head[u]; i != -1; i = edge[i].nex)
    {
        int w = edge[i].w;
        int v = edge[i].to;
        if(edge[i].vis)     // 不能重复搜边
        {
            continue;
        }
        edge[i].vis = 1;
        edge[i ^ 1 ].vis = 1;
        dfs(v, w + ds);
        edge[i ^ 1].vis = 0;
        edge[i].vis = 0;
    }
}
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    memset(head, -1, sizeof(head));
    for(int i = 1, j = 11; i <= 10000; ++i, ++j)
    {
        sum[i] = sum[i - 1] + j;//sum[i]表示节点i到根节点的路径长度之和
    }
    cin >> n;
    for(int i = 1; i <= n - 1; ++i)
    {
        int u, v, w;
        cin >> u >> v >> w;
        add(u, v, w);//通过add函数将边添加到树的邻接表中
        add(v, u, w);
    }
    int u = 1;
    // 先任选一点找到离这个点距离的最大值
    dfs(u, 0);//从1出发，计算任意节点到该节点的距离
    for(int i = 1; i <= n; ++i)//并找到距离最大的节点u
    {
        if(dis[i] > dis[u])
        {
            u = i;
        }
    }
    // 清空距离
    memset(dis, 0, sizeof(dis));
    // 再找以找到了距离最大的u这个节点, 找距离它的最大距离的点， 这个距离就是树的最大距离
    dfs(u, 0);//再次使用dfs，从u出发，计算距离u最远的节点，并将其更新为u
    for(int i = 1; i <= n; ++i)
    {
        if(dis[i] > dis[u])
        {
            u = i;
        }
    }
    int ans = sum[ dis[u] ];
    cout << ans << endl;
    return 0;
}